package models

import (
	"LoveU/utils"

	"github.com/astaxie/beego"

	"github.com/astaxie/beego/orm"
)

// 心情列表，自己和好友的
// Type:
// 1：返回自己的心情列表
// 2：返回全部的心情列表（自己和好友的）
// 返回值：
// utils.UNKNOWN_ERROR
// utils.MOOD_LIST_OK
func MoodList(userid int64, page int64, pagesize int64, Type int64) (*utils.Pagination, int64) {
	o := orm.NewOrm()
	qs := o.QueryTable("mood")
	moods := make([]*Mood, 0)
	var countAll,countInPage,pageCount int64
	switch Type {
	case 1:
		startLine := (page - 1) * pagesize
		qs = qs.Filter("userid", userid).OrderBy("-date")
		count,err0 := qs.Count()
		sum, err := qs.Limit(pagesize).Offset(startLine).All(&moods)
		if (err0!=nil&&err0!=orm.ErrNoRows) || err != nil {
			beego.Error(err.Error())
			return nil, utils.UNKNOWN_ERROR
		}
		countAll = count
		countInPage = sum
	case 2:
		startLine := (page - 1) * pagesize
		cond := orm.NewCondition()
		cond = cond.Or("userid", userid)
		friendids, status := GetFriendsId(userid)
		if status == utils.UNKNOWN_ERROR {
			beego.Error("status = ", status)
			return nil, utils.UNKNOWN_ERROR
		}
		friendids = append(friendids, &userid)
		for _, fid := range friendids {
			cond = cond.Or("userid", fid)
		}
		qs = qs.SetCond(cond).OrderBy("-date")
		count,err0 := qs.Count()
		sum, err := qs.Limit(pagesize).Offset(startLine).All(&moods)
		if (err0!=nil&&err0!=orm.ErrNoRows) || err != nil {
			beego.Error(err.Error())
			return nil, utils.UNKNOWN_ERROR
		}
		countAll = count
		countInPage = sum
	default:
		beego.Error("line-80")
		return nil, utils.UNKNOWN_ERROR
	}
	if countAll%pagesize == 0 {
		pageCount = countAll / pagesize
	} else {
		pageCount = countAll/pagesize + 1
	}
	data := &utils.Pagination{
		Page:      page,
		Pagesize:  pagesize,
		Pagecount: pageCount,
		Sum:       countInPage,
		Data:      moods,
	}
	return data, utils.MOOD_LIST_OK
}

// 新建心情
// 返回值：
// utils.UNKNOWN_ERROR：系统错误
// utils.MOOD_DELETE_OK：添加心情成功
func Newmood(userid int64, content string) int64 {
	mood := &Mood{
		Userid:  userid,
		Content: content,
	}
	o := orm.NewOrm()
	_, err := o.Insert(mood)

	if err != nil {
		// 系统错误
		return utils.UNKNOWN_ERROR
	}
	// 新建心情成功
	return utils.MOOD_POST_OK
}

// 删除心情
// 返回值：
// utils.UNKNOWN_ERROR：系统错误
// utils.MOOD_DELETE_OK：删除心情成功
func Deletemood(moodid int64, userid int64) int64 {
	o := orm.NewOrm()
	qs := o.QueryTable("mood")
	_, err := qs.Filter("id", moodid).Filter("userid", userid).Delete()

	if err != nil {
		return utils.UNKNOWN_ERROR
	}
	return utils.MOOD_DELETE_OK
}

/* 返回某心情（isMood=true）或评论（isMood=false）
（ID=parentid）下的评论（第page页，每页pagesize项）
【注意：按发表时间倒序排列】
*/
func CommentList(isMood bool, parentid, page, pagesize int64) *utils.Pagination {
	o := orm.NewOrm()
	qs := o.QueryTable("Comment").Filter("targetid", parentid).Filter("Type", isMood)
	countAll,err0 := qs.Count()
	comments := make([]*Comment, 0)
	startLine := (page - 1) * pagesize
	var dateSequence string
	if isMood {
		dateSequence = "-Date"
	} else {
		dateSequence = "Date"
	}
	sum, err1 := qs.OrderBy("-data").OrderBy(dateSequence).Limit(pagesize).Offset(startLine).All(&comments)
	if (err0!=nil&&err0!=orm.ErrNoRows) || err1 != nil {
		return nil
	}
	var pagenum int64
	if countAll%pagesize == 0 {
		pagenum = countAll / pagesize
	} else {
		pagenum = countAll/pagesize + 1
	}
	data := &utils.Pagination{
		Page:      page,
		Pagesize:  pagesize,
		Pagecount: pagenum,
		Sum:       sum,
		Data:      comments,
	}
	return data
}

// 添加评论
// tid:目标的对象的id，可以是心情的id或者评论的id，按照flag而定,true的话，目标是心情，否则市评论
func AddComment(tid, userid int64, comment string, flag bool) int64 {
	o := orm.NewOrm()
	newComment := &Comment{
		Userid:   userid,
		Type:     flag,
		Targetid: tid,
		Content:  comment,
	}
	_, err := o.Insert(newComment)
	if err != nil {
		return utils.UNKNOWN_ERROR
	}
	return utils.MOOD_POST_OK
}

// 删除评论
func DeleteComment(commentid, userid int64) int64 {
	o := orm.NewOrm()
	qs := o.QueryTable("comment")
	_, err := qs.Filter("id", commentid).Filter("userid", userid).Delete()
	if err != nil {
		return utils.UNKNOWN_ERROR
	}
	return utils.MOOD_DELETE_OK
}
